import os
from celery import Celery
from celery.schedules import crontab
from django.conf import settings

# 设置默认Django settings模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'quant_back.settings')

# 创建Celery应用
app = Celery('quant_back')

# 使用Django的settings文件配置Celery
app.config_from_object('django.conf:settings', namespace='CELERY')

# 自动从所有已注册的Django app中加载任务
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

# 配置定期任务
app.conf.beat_schedule = {
    # 数据分析任务
    'analyze-market-data-daily': {
        'task': 'data_analysis.tasks.analyze_market_data',
        'schedule': crontab(hour=15, minute=30),  # 每天下午3:30执行
        'args': ('day',),
    },
    # 'analyze-market-data-weekly': {
    #     'task': 'data_analysis.tasks.analyze_market_data',
    #     'schedule': crontab(hour=15, minute=30, day_of_week='friday'),  # 每周五下午3:30执行
    #     'args': ('week',),
    # },
    # 'analyze-market-data-monthly': {
    #     'task': 'data_analysis.tasks.analyze_market_data',
    #     'schedule': crontab(hour=15, minute=30, day_of_month=28),  # 每月28日下午3:30执行
    #     'args': ('month',),
    # },
    
    # 数据获取任务，暂时还是通过手工来下载数据。后续部署到服务器之前加上。
    # 'fetch-stock-daily-data': {
    #     'task': 'data_fetch.tasks.fetch_stock_daily_data',
    #     'schedule': crontab(hour=15, minute=0),  # 每天下午3:00执行
    #     'args': (None, None, None, None),  # 不指定参数，获取最新数据
    # },
    # 'fetch-index-daily-data': {
    #     'task': 'data_fetch.tasks.fetch_index_daily_data',
    #     'schedule': crontab(hour=15, minute=10),  # 每天下午3:10执行
    #     'args': (None, None, None, None),  # 不指定参数，获取最新数据
    # },
}

# 配置时区
app.conf.timezone = 'Asia/Shanghai'

# 配置任务结果后端
app.conf.broker_url = 'redis://localhost:6379/0'  # 使用Redis作为消息代理
app.conf.result_backend = 'redis://localhost:6379/0'

# 配置任务序列化
app.conf.task_serializer = 'json'
app.conf.result_serializer = 'json'
app.conf.accept_content = ['json']

# 配置任务路由
app.conf.task_routes = {
    'data_analysis.tasks.*': {'queue': 'analysis'},
    'data_fetch.tasks.*': {'queue': 'fetch'},
}

# 配置任务队列
app.conf.task_queues = {
    'analysis': {'exchange': 'analysis', 'routing_key': 'analysis'},
    'fetch': {'exchange': 'fetch', 'routing_key': 'fetch'},
    'default': {'exchange': 'default', 'routing_key': 'default'},
}

# 配置任务优先级
app.conf.task_queue_max_priority = 10
app.conf.task_default_priority = 5

# 配置任务重试
app.conf.task_acks_late = True  # 任务完成后再确认
app.conf.task_reject_on_worker_lost = True  # 工作进程丢失时拒绝任务

# 配置任务限制
app.conf.task_time_limit = 1800  # 30分钟硬时间限制
# Windows平台不支持soft_time_limit，移除此配置
# app.conf.task_soft_time_limit = 1200  # 20分钟软时间限制

# 配置任务日志
app.conf.worker_log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
app.conf.worker_task_log_format = '%(asctime)s - %(name)s - %(levelname)s - %(task_name)s - %(task_id)s - %(message)s'

@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')